Object ancestors := method(
    prototype := self proto
    if(prototype != Object,
    writeln("Slots of ", prototype type, "\n---------")
    prototype slotNames foreach(slotName, writeln(slotName))
    writeln
    prototype ancestors)
)
Animal := Object clone
Animal speak := method("animal noise" printIn)
Duck := Animal clone
Duck speak := method("quack" printIn)
Duck walk := method("waddle" printIn)
disco := Duck clone
disco ancestors


==> list(yield, slotValues, super, coroDoLater, uniqueHexId, ifNonNil, actorRun, do, -, isIdenticalTo, slotNames, >=, slotDescriptionMap, handleActorException, removeProto, cloneWithoutInit, markClean, argIsCall, lazySlot, wait, removeAllSlots, slotSummary, asSimpleString, setProtos, evalArgAndReturnSelf, apropos, in, raiseIfError, print, ownsSlots, continue, become, evalArgAndReturnNil, removeAllProtos, doString, ancestors, compare, argIsActivationRecord, <=, setSlot, inlineMethod, coroFor, newSlot, setProto, thisContext, ifNonNilEval, asyncSend, evalArg, relativeDoFile, @, memorySize, hasLocalSlot, @@, addTrait, ancestorWithSlot, while, type, ifNil, block, , actorProcessQueue, performWithArgList, returnIfNonNil, clone, ==, writeln, serialized, if, pause, returnIfError, >, doRelativeFile, getSlot, <, init, .., ifError, shallowCopy, futureSend, hasSlot, proto, lexicalDo, foreachSlot, uniqueId, for, launchFile, return, currentCoro, coroDo, isError, ifNilEval, isLaunchScript, perform, isTrue, setSlotWithType, or, stopStatus, ?, contextWithSlot, break, appendProto, isKindOf, asString, println, getLocalSlot, isActivatable, hasProto, doMessage, isNil, coroWith, serializedSlots, protos, list, message, switch, write, resend, deprecatedWarning, method, serializedSlotsWithNames, setIsActivatable, !=, and, loop, not, thisLocalContext, justSerialized, updateSlot, asBoolean, thisMessage, removeSlot, try, hasDirtySlot, doFile, prependProto)